源码解析|Apache Doris源码阅读与解析系列第0讲——从零认识Doris代码库
课 程 介 绍
亲爱的各位小伙伴们,大家期待已久的直播课程终于要跟大家见面了!
《 Apache Doris 源码阅读与解析》系列直播活动旨在帮助 Apache Doris 社区的开发者或者有意向参与 Apache Doris 社区建设的小伙伴们,可以更快熟悉 Apache Doris 代码的组织结构和一些主要流程的实现原理以及代码位置,以便于各位小伙伴们能够快速上手,参与到开发工作中来。
本系列直播课程暂定分为 10 次课程,涵盖了 Apache Doris 中大部分重点流程的讲解,包括建表语句执行、数据写入、SQL执行、数据读取、查询优化器以及元数据管理等。
课 程 正 文
本期课程《从零认识 Doris 代码库》为 Apache Doris 源码解析系列直播课程 的第 0 讲,作为导读文章来帮助开发者从整体角度了解 Apache Doris 的代码结构和开发流程,以便后续能够更快上手参与 Doris 的代码开发。
Doris 源码的获取及提交
Doris 开发环境的搭建
Doris 系统架构简述
Doris 代码目录结构说明
Doris 代码合入准则
01 Apache Doris 源码的获取及提交
这里我们直接参阅 Apache Doris 官网的 代码提交指南 即可,链接:
http://doris.incubator.apache.org/master/zh-CN/community/pull-request.html
02 Apache Doris 开发环境搭建
Doris 的代码主要是语言为 Java 和 C++。其中 FE 模块主要由 Java 编写,而 BE 模块主要由 C++ 编写。这里我们分别就 FE 和 BE 的开发环境进行说明。
FE 开发环境
FE 中的 Java 代码由 Maven 进行管理。这里我们推荐使用 IntelliJ IDEA 进行开发,
IntelliJ IDEA 的开发环境搭建可以参阅 官方文档 ,链接:
http://doris.incubator.apache.org/master/zh-CN/developer-guide/fe-idea-dev.html
在工程创建完成后,建议配置 IDEA 的如下两个功能,以方便通过代码格式检查:
Editor -> Code Style -> Java 中配置 Imports Order。
Imports Order 的具体顺序可参阅 官方文档 ,链接:
http://doris.incubator.apache.org/master/zh-CN/developer-guide/java-format-code.html#import-order
在
Save Actions
设置保存时自动格式化。建议在格式化选项中仅勾选
Optimize imports
和Reformat only changed code
。以保证 Import 顺序,以及不会自动格式化其他未变更的代码。
BE 开发环境
BE 开发环境请参阅 官方文档 ,链接:
http://doris.incubator.apache.org/master/zh-CN/developer-guide/be-vscode-dev.html
BE 的代码自动格式化请参阅 官网文档 ,链接:
http://doris.incubator.apache.org/master/zh-CN/developer-guide/cpp-format-code.html#
cd incubator-doris/.git/hooks
创建文件
pre-commit
内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #!/bin/bash format_file() { file="${1}" if [ -f $file ]; then clang-format -i -style=file ${1} git add ${1} fi } case "${1}" in --about ) echo "Runs clang-format on source files" ;; * ) for file in `git diff-index --cached --name-only HEAD | grep -iE '\.(cpp|cc|h|hpp)$' ` ; do format_file "${file}" done ;; esac |
修改
pre-commit
文件权限:chmod +x pre-commit
, 之后在 git commit 的时候就会自动格式化变更的代码了。
03 Apache Doris 系统架构简述
如上图,Doris 主要有两类进程:Frontend(FE) 和 Backend(BE) 。
Frontend
接收用户连接请求(MySQL 协议层) 元数据存储与管理 查询语句的解析与查询计划的执行 集群管控
Backend
数据存储与管理
查询计划的执行
04 Apache Doris 代码目录结构说明
这里我们从根目录说起,以 commit b3ae607f 为例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | ├── be // BE 代码目录 ├── bin // FE/BE 的启停脚本 ├── build_plugin.sh // FE 插件编译脚本 ├── build.sh // Doris 编译脚本 ├── build-support // 编译用辅助脚本 ├── CODE_OF_CONDUCT.md // 贡献者代码行为准则 ├── conf // FE/BE 的配置文件 ├── contrib // 第三方贡献代码,如 udf ├── CONTRIBUTING_CN.md ├── CONTRIBUTING.md ├── DISCLAIMER ├── docker // Doris 开发镜像的 Dockerfile ├── docs // 文档目录 ├── env.sh ├── extension // 扩展功能代码,如 flink connector 等 ├── fe // FE 代码目录 ├── fe_plugins // FE 插件目录 ├── fs_brokers // Broker 代码目录 ├── gensrc // thrift/protobuf 等代码生成目录 ├── LICENSE.txt ├── NOTICE.txt ├── README.md ├── run-be-ut.sh // BE 单元测试运行脚本 ├── run-fe-ut.sh // FE 单元测试运行脚本 ├── samples // 示例代码目录 ├── thirdparty // 第三方依赖库目录 ├── tools // 一些辅助工具 ├── tsan_suppressions ├── ui // FE 前端代码目录 └── webroot // 一些静态网页相关代码 |
这里我们主要介绍 fe/ be/ gensrc/ extension/ 四个目录。
fe/
1 2 3 4 5 6 7 8 | ├── checkstyle-apache-header.txt ├── checkstyle.xml ├── conf ├── fe-common // 一些 FE 模块的通用代码 ├── fe-core // FE 模块主代码 ├── pom.xml ├── README └── spark-dpp // Spark Load 所依赖的 Spark 导入程序代码 |
fe-core 为 FE 的核心代码模块
1 2 3 4 5 6 7 8 | ├── main │ ├── cup // 语法定义文件 │ ├── java // 主代码 │ ├── jflex // 词法定义文件 │ └── resources └── test // 单元测试 ├── java └── resources |
在 main/java/org/apache/doris/
下即是 FE 代码的主要部分了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | ├── alter // 表结构变更操作相关的代码。包括表结构变更,物化视图等。 ├── analysis // 包含所有SQL语法的java实例类 ├── backup // 备份恢复操作相关的代码 ├── blockrule // SQL 黑名单相关代码 ├── catalog // 包含元数据操作的主类和各种数据库、表、分区的元数据实例类 ├── clone // 数据副本修复和均衡相关的代码 ├── cluster // 已废弃 ├── common // 一些工具类和通用定义 ├── consistency // 数据一致性校验相关的代码 ├── deploy // 部署相关代码 ├── external // Doris on Elasticsearch相关的代码 ├── ha // 元数据高可用相关的代码 ├── http // http v1 代码 ├── httpv2 // http v2 代码(逐步替换v1) ├── journal // 元数据日志相关的代码 ├── ldap // LDAP 认证相关代码 ├── load // 导入作业相关代码 ├── master // FE Master角色相关的操作代码,如元数据Checkpoint,BE任务汇报的处理等。 ├── metric // FE 监控指标相关的代码 ├── monitor // JVM 监控相关代码 ├── mysql // MySQL协议层相关代码 ├── PaloFe.java // Main函数入口 ├── persist // 元数据持久化相关的代码 ├── planner // 查询优化器相关的代码 ├── plugin // Frontend端插件管理相关代码 ├── qe // 用于处理各类SQL请求相关的代码。如查询请求的处理类、DDL请求的处理类等 ├── resource // 资源标签相关的代码 ├── rewrite // 查询优化器重写规则相关的代码 ├── rpc // Frontend和Backend之间RPC协议相关的代码 ├── service // Frontend侧各种服务器端代码 ├── system // 集群节点的实例类和集群节点管理相关的代码 ├── task // Frontend发往Backend的各类任务相关的代码 └── transaction // 导入事务相关代码 |
be/
1 2 3 | ├── CMakeLists.txt // CMake 编译文件 ├── src // 主代码目录 ├── test // 单元测试 |
主代码目录包含:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ├── agent // FE 下发的 agent task 相关处理类 ├── common // 通用类 ├── env // 文件系统操作类 ├── exec // 执行算子相关代码 ├── exprs // 表达式、函数计算相关代码 ├── geo // 地理位置函数相关代码 ├── glibc-compatibility // GLIBC 兼容代码 ├── gutil // Google gutil 相关代码 ├── http // BE 端 http server 相关代码 ├── olap // 存储层代码 ├── plugin // BE 插件管理相关代码 ├── runtime // 查询层运行时相关代码 ├── service // BE 对外服务接口相关代码 ├── testutil // 单元测试辅助类 ├── tools // 辅助工具相关代码 ├── udf // 用户自定义函数相关代码 └── util // 一些工具类 |
gensrc/
1 2 3 4 | ├── Makefile ├── proto // protobuf 定义文件 ├── script // 一些辅助脚本,包括函数定义代码生成模板等 └── thrift // thrift 定义文件 |
extension
extension/
1 2 3 4 | ├── DataX // DataX doriswriter 插件 ├── flink-doris-connector // Flink Doris Connector ├── logstash // logstash 导入插件 └── spark-doris-connector // Spark Doris Connector |
05 Apache Doris 代码合入准则
开发者在本地修改完代码后,需要完成以下几个步骤,方可提交代码:
运行
run-fe-ut.sh
和run-be-ut.sh
来运行单元测试并确认通过。提交 Pull Request
Pull Request 会触发准入测试:
1.
Travis CI/continuous-integration
:文档编译准入。会对docs/
目录进行编译2.
ut_build
:单元测试准入。会运行 fe/be 单元测试。3.
NewDorisTest
:一个包含100多个 case 的最小回归测试集。
只有在以上准入测试都通过,并且有至少一个 Committer Approve 后,代码方可合入。
06 结语
以上就是本系列课程的开篇。希望能够帮助大家对 Doris 项目有个宏观的认识。
下 期 预 告
用户请求的入口函数在哪里
一个 DDL 语句是如何解析等
Doris 元数据的修改和持久化
建表任务的创建以及 FE 与 BE 之间的任务交互过程
下期课程预计将于 9 月 29 日晚 19 点开始,课程时长约 30 分钟,届时我们将提前通过 ApacheDoris 微信公众号发出直播链接,欢迎大家持续关注。
如果各位小伙伴有其他想了解的模块,欢迎在微信公众号后台向我们留言,也可以点击文末阅读原文填写调查问卷,我们将会另行安排大家感兴趣的模块进行讲解。
活动预告|Apache Doris 源码阅读与解析系列直播深度解析|Apache Doris 索引机制解析最佳实践|Apache Doris Join 实现与调优实践
社区活动| Apache Doris 社区征文活动邀您参加~
欢迎扫码关注:
Apache Doris(incubating)官方公众号
相关链接:
Apache Doris官方网站:
http://doris.incubator.apache.org
Apache Doris Github:
https://github.com/apache/incubator-doris
Apache Doris 开发者邮件组:
dev@doris.apache.org